using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using JGSY.CMS.LowCode.Platform.Application.DTOs;
using JGSY.CMS.LowCode.Platform.Application.Interfaces;
using System.ComponentModel.DataAnnotations;

namespace JGSY.CMS.LowCode.Platform.Controllers
{
    /// <summary>
    /// 用户管理控制器
    /// 提供用户信息管理、用户列表查询、用户状态管理等RESTful API接口
    /// 专注于用户数据的CRUD操作，认证相关功能请使用 AuthenticationController
    /// </summary>
    /// <remarks>
    /// 主要功能包括：
    /// - 用户信息查询和更新
    /// - 用户列表管理
    /// - 用户状态管理
    /// - 用户权限管理
    /// 
    /// 注意：用户注册、登录、密码重置等认证功能已移至 AuthenticationController
    /// </remarks>
    [Route("api/[controller]")]
    [ApiController]
    [Authorize]
    public class UsersController : ControllerBase
    {
        /// <summary>
        /// 用户应用服务接口
        /// 处理用户相关的业务逻辑
        /// </summary>
        private readonly IUserAppService _userService;
        
        /// <summary>
        /// 日志记录器
        /// 记录API操作日志和错误信息
        /// </summary>
        private readonly ILogger<UsersController> _logger;

        /// <summary>
        /// 初始化用户控制器
        /// </summary>
        /// <param name="userService">用户应用服务，处理用户业务逻辑</param>
        /// <param name="logger">日志记录器，记录操作日志</param>
        public UsersController(IUserAppService userService, ILogger<UsersController> logger)
        {
            _userService = userService;
            _logger = logger;
        }

        /// <summary>
        /// 用户信息更新请求模型
        /// 用于更新用户的基本信息
        /// </summary>
        public class UpdateUserRequest
        {
            /// <summary>
            /// 显示名称
            /// 用户的显示名称或昵称
            /// </summary>
            [StringLength(100, ErrorMessage = "显示名称长度不能超过100个字符")]
            public string? DisplayName { get; set; }
            
            /// <summary>
            /// 邮箱地址
            /// 用户的邮箱地址
            /// </summary>
            [EmailAddress(ErrorMessage = "邮箱格式不正确")]
            [StringLength(100, ErrorMessage = "邮箱长度不能超过100个字符")]
            public string? Email { get; set; }
            
            /// <summary>
            /// 手机号码
            /// 用户的手机号码
            /// </summary>
            [Phone(ErrorMessage = "手机号码格式不正确")]
            public string? Phone { get; set; }
        }

        /// <summary>
        /// 获取用户列表（简化版本）
        /// </summary>
        /// <returns>用户列表</returns>
        /// <remarks>
        /// 注意：此接口为简化实现，实际项目中应实现分页、搜索等功能。
        /// 完整的用户管理功能需要在IUserAppService中实现相应方法。
        /// </remarks>
        [HttpGet]
        [Authorize(Roles = "Admin")]
        public ActionResult<object> GetUsers()
        {
            try
            {
                // 简化实现，返回提示信息
                return Ok(new { 
                    message = "用户列表功能需要完善IUserAppService接口",
                    note = "请实现GetUsersAsync、GetByIdAsync、UpdateUserAsync等方法"
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error getting users list");
                return BadRequest(new { message = ex.Message });
            }
        }

        /// <summary>
        /// 根据ID获取用户信息（简化版本）
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <returns>用户信息</returns>
        [HttpGet("{id}")]
        [Authorize(Roles = "Admin")]
        public ActionResult<object> GetUser(long id)
        {
            try
            {
                return Ok(new { 
                    message = $"获取用户{id}的信息功能需要完善",
                    note = "请在IUserAppService中实现GetByIdAsync方法"
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error getting user {UserId}", id);
                return BadRequest(new { message = ex.Message });
            }
        }

        /// <summary>
        /// 更新用户信息（简化版本）
        /// </summary>
        /// <param name="id">用户ID</param>
        /// <param name="request">用户信息更新请求</param>
        /// <returns>更新结果</returns>
        [HttpPut("{id}")]
        public ActionResult UpdateUser(long id, [FromBody] UpdateUserRequest request)
        {
            try
            {
                // 检查权限：用户只能更新自己的信息，除非是管理员
                var currentUserId = GetCurrentUserId();
                if (currentUserId != id && !User.IsInRole("Admin"))
                {
                    return Forbid("您只能更新自己的信息");
                }

                return Ok(new { 
                    message = "用户信息更新功能需要完善",
                    note = "请在IUserAppService中实现UpdateUserAsync方法",
                    data = request
                });
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error updating user {UserId}", id);
                return BadRequest(new { message = ex.Message });
            }
        }

        /// <summary>
        /// 获取当前登录用户信息
        /// </summary>
        /// <returns>当前用户的详细信息</returns>
        /// <response code="200">成功返回用户信息</response>
        /// <response code="401">用户未登录或令牌无效</response>
        /// <response code="400">获取用户信息失败</response>
        /// <remarks>
        /// 此接口需要用户身份验证，通过Authorization头传递有效的JWT令牌。
        /// 返回的用户信息不包含敏感数据（如密码哈希）。
        /// 
        /// 请求头示例：
        /// ```
        /// Authorization: Bearer your_jwt_token_here
        /// ```
        /// 
        /// 响应示例：
        /// ```
        /// {
        ///   "id": 1,
        ///   "username": "testuser",
        ///   "email": "test@example.com",
        ///   "displayName": "Test User",
        ///   "isActive": true,
        ///   "createdAt": "2025-08-08T10:30:00.000Z"
        /// }
        /// ```
        /// </remarks>
        [HttpGet("me")]
        public async Task<ActionResult<UserDto>> Me()
        {
            try
            {
                var user = await _userService.GetCurrentUserAsync();
                if (user == null) return Unauthorized();
                return Ok(user);
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, "Error getting current user");
                return BadRequest(new { message = ex.Message });
            }
        }

        /// <summary>
        /// 获取当前用户ID的辅助方法
        /// </summary>
        /// <returns>当前用户ID</returns>
        private long? GetCurrentUserId()
        {
            var userIdClaim = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
            if (long.TryParse(userIdClaim, out var userId))
                return userId;
            return null;
        }
    }
}
